
#ifndef UTILS_SYSTEM_ERROR_H
#define UTILS_SYSTEM_ERROR_H

#if defined(UTILS_ALL_BOOST)
#if !defined(UTILS_SYSTEM_ERROR_BOOST) && !defined(UTILS_SYSTEM_ERROR_STANDARD) 
#define UTILS_SYSTEM_ERROR_BOOST
#endif
#elif defined(UTILS_ALL_STANDARD)
#if !defined(UTILS_SYSTEM_ERROR_BOOST) && !defined(UTILS_SYSTEM_ERROR_STANDARD) 
#define UTILS_SYSTEM_ERROR_STANDARD
#endif
#endif

#if defined(UTILS_SYSTEM_ERROR_BOOST)
#include <boost/system/system_error.hpp>
#include <boost/system/error_code.hpp>
#include "type_traits.h"
namespace utils {
  using ::boost::system::error_category;
  using ::boost::system::error_code;
  using ::boost::system::error_condition;
  using ::boost::system::system_error;

  template<class T>
  struct is_error_code_enum : public ::boost::system::is_error_code_enum<T> {};

  template<class T>
  struct is_error_condition_enum : public ::boost::system::is_error_condition_enum<T> {};

  namespace errc = ::boost::system::errc;

  using ::boost::system::generic_category;
  using ::boost::system::system_category;

  using ::boost::system::make_error_code;
  using ::boost::system::make_error_condition;
}
#elif defined(UTILS_SYSTEM_ERROR_STANDARD)
#include <system_error>
#include "type_traits.h"
namespace utils {
  using std::error_category;
  using std::error_code;
  using std::error_condition;
  using std::system_error;

  template<class T>
  struct is_error_code_enum : public std::is_error_code_enum<T> {};

  template<class T>
  struct is_error_condition_enum : public std::is_error_condition_enum<T> {};

  using std::errc;

  using std::generic_category;
  using std::system_category;

  using std::make_error_code;
  using std::make_error_condition;
}
#endif

#endif // UTILS_SYSTEM_ERROR_H

